
// 1.内置声明文件 （*.d.ts）
// lib.es5.d.ts - 数组、对象、字符串相关属性和方法
const arr = [1, 2, 3]
arr.push(4)
// lib.dom.d.ts - DOM、BOM相关方法和对象
document.querySelectorAll('div')

// 2.第三方库的类型声明文件
// 2.1
// import axios from 'axios';
// axios.get()
// axios.post()
// 2.2
import jquery from 'jquery';
jquery.ajax()

// 3.自定义的类型声明文件
// 3.1
import { Personal } from './types';
const personal: Personal = {
  name: '张三',
  age: 80,
  gender: '男'
}
console.log(personal);
// 3.2
import { add, point } from './add'
add(10, 20)
point({ x: 100, y: 200 })

/* -------------------------------------------------- */

// : 'jack' 是字面量类型
let name: 'jack' = 'jack';
console.log(name);

// : 18 是字面量类型
let age: 18 = 18;
console.log(age);
// 报错：不能将类型“19”分配给类型“18”
// age = 19;

// 通过类型推断发现，str1 类型是 string ， str2 类型是 Hello TS
// 原因：str2 是 const 声明的，值只能是 Hello TS，所以类型只能是 Hello TS
let str1 = 'Hello TS';
const str2 = 'Hello TS';
console.log(str1);
console.log(str2);

// 字面量联合类型
type Gender = '男' | '女'
let gender: Gender = '男'
gender = '女'
console.log('性别：' + gender);


/* -------------------------------------------------- */

// any类型：any 的使用越多，程序可能出现的漏洞越多，因此不推荐使用 any 类型，尽量避免使用
let obj: any = { age: 18 }
obj.bar = 100
obj()
const n: number = obj
console.log(n);


/* -------------------------------------------------- */

// Pick 与 Omit （属于内置类型，不需要声明，直接用）
type Person = {
  name?: string
  age?: number
  gender?: string
  hobby?: []
}
// Pick 可以从一个对象类型中取出某些属性
type PickPerson = Pick<Person, 'name' | 'age'>
const pickPerson: PickPerson = { name: '李华', age: 10 }
console.log(pickPerson);
// Omit 可以从一个对象类型中排出某些属性
type Omitperson = Omit<Person, 'hobby' | 'age'>
const omitPerson: Omitperson = { name: '李华', gender: '男' }
console.log(omitPerson);


/* -------------------------------------------------- */

